package com.autumn.scheduler.domain.services;

import org.quartz.JobKey;

import com.autumn.common.api.application.dto.input.PageQueryInput;
import com.autumn.common.api.application.dto.output.IPageQueryResult;
import com.autumn.scheduler.api.QueueSchedulerStatus;
import com.autumn.scheduler.api.services.dto.input.AutumnJobDetailsAddInput;
import com.autumn.scheduler.api.services.dto.input.AutumnJobDetailsUpdateInput;
import com.autumn.scheduler.api.services.dto.output.AutumnJobDetailsOutput;
import com.autumn.scheduler.api.services.dto.output.AutumnJobLogOutput;
import com.autumn.scheduler.domain.entities.AutumnJobDetails;
import com.autumn.scheduler.domain.entities.AutumnJobLog;
import com.autumn.scheduler.domain.values.SchedulerValue;
import com.autumn.scheduler.job.trigger.AbstractJobTrigger;

/**
 * 
 * 描述：
 * 
 * @author 杨昌国 2018-03-20 00:16:34
 */
public interface IJobService {

	/**
	 * 添加作业
	 * 
	 * @param autumnJobDetail
	 *            作业信息
	 * @param schedulerValue
	 *            调度值
	 * @param jobTrigger
	 *            任务触发器
	 */
	void addJob(AutumnJobDetails autumnJobDetail, SchedulerValue schedulerValue, AbstractJobTrigger jobTrigger);

	/**
	 * 添加作业
	 * 
	 * @param input
	 *            输入
	 * @return 返回任务详情
	 */
	AutumnJobDetailsOutput addJob(AutumnJobDetailsAddInput input);
	
	/**
	 * 更新作业
	 * 
	 * @param autumnJobDetail
	 *            作业信息
	 * @param schedulerValue
	 *            调度值
	 * @param jobTrigger
	 *            任务触发器
	 */
	void updateJob(AutumnJobDetails autumnJobDetail, SchedulerValue schedulerValue, AbstractJobTrigger jobTrigger);

	/**
	 * 删除作业
	 * 
	 * @param key
	 *            键
	 */
	void deleteJob(JobKey key);

	/**
	 * 删除作业
	 * 
	 * @param id
	 *            主键
	 */
	boolean deleteJob(long id);

	/**
	 * 触发任务
	 * 
	 * @param key
	 *            键
	 *
	 */
	void triggerJob(JobKey key);

	/**
	 * 触发任务
	 * 
	 * @param id
	 *            主键
	 *
	 */
	void triggerJob(long id);

	/**
	 * 运行任务
	 * 
	 * @param log
	 *            日志
	 * @param isDeleteJob
	 *            是否删除任务
	 */
	void runJob(AutumnJobLog log, boolean isDeleteJob);

	/**
	 * 更新作业状态
	 * 
	 * @param status
	 *            状态
	 */
	int updateJobStatus(QueueSchedulerStatus status);

	/**
	 * 暂停任务
	 * 
	 * @param key
	 */
	void pauseJob(JobKey key);

	/**
	 * 暂停任务
	 * 
	 * @param id
	 */
	boolean pauseJob(long id);

	/**
	 * 全部暂停
	 * 
	 */
	int pauseAllJob();

	/**
	 * 恢复任务
	 * 
	 * @param key
	 */
	void resumeJob(JobKey key);

	/**
	 * 恢复任务
	 * 
	 * @param id
	 */
	boolean resumeJob(long id);

	/**
	 * 全部恢复
	 * 
	 * @param id
	 */
	int resumeAllJob();

	/**
	 * 获取作业
	 * 
	 * @param id
	 *            主键
	 */
	AutumnJobDetailsOutput getJob(long id);

	/**
	 * 根据友好名称和组 获取 JobKey
	 * 
	 * @param jobFriendlyName
	 *            友好名称
	 * @param jobGroup
	 *            组名
	 * @return
	 *
	 */
	JobKey getJobKeyByFriendly(String jobFriendlyName, String jobGroup);

	/**
	 * 根据友好名称和组 获取详情
	 * 
	 * @param jobFriendlyName
	 *            友好名称
	 * @param jobGroup
	 *            组名
	 * @return
	 *
	 */
	AutumnJobDetails getJobDetailsByFriendly(String jobFriendlyName, String jobGroup);

	

	/**
	 * 更新作业
	 * 
	 * @param input
	 *            输入
	 * @return 返回任务详情
	 */
	AutumnJobDetailsOutput updateJob(AutumnJobDetailsUpdateInput input);

	/**
	 * 任务查询
	 * 
	 * @param input
	 *            输入
	 * @return 返回分页查询
	 */
	IPageQueryResult<AutumnJobDetailsOutput> jobQuery(PageQueryInput input);

	/**
	 * 日志查询
	 * 
	 * @param input
	 *            输入
	 * @return 返回分页查询
	 */
	IPageQueryResult<AutumnJobLogOutput> logQuery(PageQueryInput input);

	/**
	 * 清除所有作业日志
	 */
	void clearAllJobLog();
}
